#ifndef XLCOMM_BASE_DATETIME_H_
#define XLCOMM_BASE_DATETIME_H_

#include <stdint.h>

#include <string>

#include "xlcomm/copyable.h"
#include "xlcomm/define.h"
#include "xlcomm/noncopyable.h"

namespace xlcomm {

// 日期时间结构体
struct CommTime {
  int year;
  int month;
  int day;
  int week;
  int hour;
  int minute;
  int second;
  int usec;
};

using Timestamp = int64_t;

// 日期时间类
class XLCOMM_API DateTime : copyable {
 public:
  static const int64_t kMicroSecondsPerSecond = 1000 * 1000;

  DateTime();

  ////////////////////// 时间相关 //////////////////////
  // 获取当前时间
  static CommTime Now();

  // 时间格式化（格式为：20220101 08:00:00.000000）
  static std::string Format(const CommTime& time);

  // 比较两个时间是否相等（精确到秒）
  static bool Equal(const CommTime& time1, const CommTime& time2);

  // timeval类型转CommTime类型
  static CommTime TimevalToCommTime(const struct timeval& tv);

  ////////////////////// 时间戳相关 //////////////////////
  // 获取当前时间戳。单位：us（从Epoch 1970-01-01 00:00:00.000000开始）
  static Timestamp NowTimestamp();

  // 时间戳转为CommTime类型
  static CommTime ToCommTime(Timestamp ts);

  // 时间戳格式化（格式为：20220101 08:00:00.000000）
  static std::string Format(Timestamp ts);

  // 时间戳加多少秒
  static Timestamp AddSeconds(Timestamp ts, double seconds);

  // 获取一个无效时间戳
  static Timestamp Invalid() { return 0; }

  // 判断时间戳是否有效
  static bool Valid(Timestamp ts) { return ts > 0; }
};

// 计时器类
class XLCOMM_API Timing : noncopyable {
 public:
  static const int64_t kMicroSecondsPerSecond = 1000 * 1000;

  Timing();

  // 开始计时
  void Start();

  // 停止计时，并返回计时的持续时间。单位：us
  int64_t Stop();

 private:
  int64_t start_timestamp_;
};

}  // namespace xlcomm

#endif  // XLCOMM_BASE_DATETIME_H_